108ebf97e067ccec1abc2023816a921e5b80b473,src/com/redhat/ceylon/compiler/java/codegen/ExpressionTransformer.java,ExpressionTransformer,transformComprehension,#Comprehension#,1683
Before Change
if (reassign) {
otherCondition = makeLetExpr(_varName, List.<JCStatement>nil(), make().Type(syms().objectType), _expr, test);
} else {
otherCondition = make().Unary(JCTree.NOT, makeLetExpr(_varName, List.<JCStatement>nil(), make().Type(syms().objectType), _expr, test));
}
} else if (cond instanceof ExistsCondition) {
JCExpression expression = transformExpression(var.getSpecifierExpression().getExpression());
otherCondition = make().Binary(reassign ? JCTree.NE : JCTree.EQ, expression, makeNull());
} else if (cond instanceof NonemptyCondition) {
JCExpression expression = transformExpression(var.getSpecifierExpression().getExpression());
String varName = tempName();
JCExpression test = makeNonEmptyTest(null, varName);
if (reassign) {
otherCondition = makeLetExpr(varName, List.<JCStatement>nil(), make().Type(syms().objectType), expression, test);
} else {
otherCondition = make().Unary(JCTree.NOT, makeLetExpr(varName, List.<JCStatement>nil(), make().Type(syms().objectType), expression, test));
}
} else if (cond instanceof BooleanCondition) {
otherCondition = make().Unary(JCTree.NOT, transformExpression(((BooleanCondition) cond).getExpression(),
BoxingStrategy.UNBOXED, typeFact().getBooleanDeclaration().getType()));
} else {
return makeErroneous(cond, "This type of condition is not supported yet for comprehensions");
}
condExpr = make().Binary(JCTree.AND, condExpr, otherCondition);
//Create the context method that filters from the last iterator
ctxtName = "next"+idx;
fields.add(make().MethodDef(make().Modifiers(2), names().fromString(ctxtName),
makeJavaType(typeFact().getBooleanDeclaration().getType()),
List.<JCTree.JCTypeParameter>nil(), List.<JCTree.JCVariableDecl>nil(),
List.<JCExpression>nil(), make().Block(0, List.<JCStatement>of(
make().WhileLoop(condExpr, make().Block(0, reassign ? List.<JCStatement>of(
//If there's a var, assign the last item to it
make().If(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")),
make().Exec(make().Assign(makeUnquotedIdent(var.getDeclarationModel().getName()),
make().TypeCast(makeJavaType(var.getDeclarationModel().getType(), NO_PRIMITIVES), transformExpression(var.getSpecifierExpression().getExpression())
))), null)
) : List.<JCStatement>nil())),
make().Return(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")))
)), null));
clause = ((IfComprehensionClause)clause).getComprehensionClause();
After Change
makeJavaType(typeFact().getBooleanDeclaration().getType()),
List.<JCTree.JCTypeParameter>nil(), List.<JCTree.JCVariableDecl>nil(),
List.<JCExpression>nil(), make().Block(0, List.<JCStatement>of(
make().WhileLoop(condExpr, make().Block(0, List.<JCStatement>nil())),
make().Return(make().Unary(JCTree.NOT, makeUnquotedIdent(prevItemVar+"$exhausted")))
)), null));
clause = ((IfComprehensionClause)clause).getComprehensionClause();